{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Text classification and sentiment analysis: Twitter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once text data has been converted into numerical features using the natural language processing techniques discussed in the previous sections, text classification works just like any other classification task.\n",
    "\n",
    "In this notebook, we will apply these preprocessing technique to news articles, product reviews, and Twitter data and teach various classifiers to predict discrete news categories, review scores, and sentiment polarity."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-26T06:37:13.006374Z",
     "start_time": "2018-11-26T06:37:12.515786Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import warnings\n",
    "from collections import Counter, OrderedDict\n",
    "from pathlib import Path\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from pandas.io.json import json_normalize\n",
    "import pyarrow as pa   \n",
    "import pyarrow.parquet as pq\n",
    "from fastparquet import ParquetFile \n",
    "from scipy import sparse\n",
    "from scipy.spatial.distance import pdist, squareform\n",
    "\n",
    "# Visualization\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import FuncFormatter, ScalarFormatter\n",
    "import seaborn as sns\n",
    "\n",
    "# spacy, textblob and nltk for language processing\n",
    "from textblob import TextBlob, Word\n",
    "\n",
    "# sklearn for feature extraction & modeling\n",
    "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.naive_bayes import MultinomialNB\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score, confusion_matrix\n",
    "from sklearn.externals import joblib\n",
    "\n",
    "import lightgbm as lgb\n",
    "\n",
    "import json\n",
    "from time import clock, time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-26T06:37:13.010613Z",
     "start_time": "2018-11-26T06:37:13.007802Z"
    }
   },
   "outputs": [],
   "source": [
    "plt.style.use('fivethirtyeight')\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Twitter Sentiment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We use a dataset that contains 1.6 million training and 350 test tweets from 2009 with algorithmically assigned binary positive and negative sentiment scores that are fairly evenly split."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Download the data from [here](http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Extract the content of the compressed file, move to 'data/sentiment140/' and rename the files:\n",
    "- `training.1600000.processed.noemoticon.csv` to `train.csv`, and\n",
    "- `testdata.manual.2009.06.14.csv` to `test.csv`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 0 - the polarity of the tweet (0 = negative, 2 = neutral, 4 = positive); training data has no neutral tweets\n",
    "- 1 - the id of the tweet (2087)\n",
    "- 2 - the date of the tweet (Sat May 16 23:58:44 UTC 2009)\n",
    "- 3 - the query (lyx). If there is no query, then this value is NO_QUERY. (only test data uses query)\n",
    "- 4 - the user that tweeted (robotickilldozr)\n",
    "- 5 - the text of the tweet (Lyx is cool)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Read train/test data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We move the data to the faster parqu3et"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:00:48.485331Z",
     "start_time": "2018-11-22T18:57:39.456400Z"
    }
   },
   "outputs": [],
   "source": [
    "names = ['polarity', 'id', 'date', 'query', 'user', 'text']\n",
    "train = (pd.read_csv('data/sentiment140/train.csv',\n",
    "                     low_memory=False,\n",
    "                     encoding='latin1',\n",
    "                     header=None,\n",
    "                     names=names,\n",
    "                     parse_dates=['date'])\n",
    "         .drop(['id', 'query'], axis=1)\n",
    "         .drop_duplicates(subset=['polarity', 'text']))\n",
    "\n",
    "train = train[train.text.str.len()<=140]\n",
    "train.polarity = (train.polarity>0).astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:00:48.675865Z",
     "start_time": "2018-11-22T19:00:48.486380Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1566668 entries, 0 to 1599999\n",
      "Data columns (total 4 columns):\n",
      "polarity    1566668 non-null int64\n",
      "date        1566668 non-null datetime64[ns]\n",
      "user        1566668 non-null object\n",
      "text        1566668 non-null object\n",
      "dtypes: datetime64[ns](1), int64(1), object(2)\n",
      "memory usage: 59.8+ MB\n"
     ]
    }
   ],
   "source": [
    "train.info(null_counts=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:00:49.731086Z",
     "start_time": "2018-11-22T19:00:48.676975Z"
    }
   },
   "outputs": [],
   "source": [
    "train.to_parquet('data/sentiment140/train.parquet')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:17:51.114458Z",
     "start_time": "2018-11-22T19:17:51.034471Z"
    }
   },
   "outputs": [],
   "source": [
    "test = (pd.read_csv('data/sentiment140/test.csv',\n",
    "                    low_memory=False,\n",
    "                    encoding='latin1',\n",
    "                    header=None,\n",
    "                    names=names,\n",
    "                    parse_dates=['date'])\n",
    "        .drop(['id', 'query'], axis=1)\n",
    "        .drop_duplicates(subset=['polarity', 'text']))\n",
    "test = test[(test.text.str.len()<=140) & (test.polarity.isin([0,4]))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:17:51.785326Z",
     "start_time": "2018-11-22T19:17:51.769276Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 354 entries, 0 to 497\n",
      "Data columns (total 4 columns):\n",
      "polarity    354 non-null int64\n",
      "date        354 non-null datetime64[ns, UTC]\n",
      "user        354 non-null object\n",
      "text        354 non-null object\n",
      "dtypes: datetime64[ns, UTC](1), int64(1), object(2)\n",
      "memory usage: 13.8+ KB\n"
     ]
    }
   ],
   "source": [
    "test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:17:53.872380Z",
     "start_time": "2018-11-22T19:17:53.867964Z"
    }
   },
   "outputs": [],
   "source": [
    "test.to_parquet('data/sentiment140/test.parquet')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:16:36.901020Z",
     "start_time": "2018-11-22T19:16:36.392462Z"
    }
   },
   "outputs": [],
   "source": [
    "train = pd.read_parquet('data/sentiment140/train.parquet')\n",
    "test = pd.read_parquet('data/sentiment140/test.parquet')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Explore data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:18:03.927318Z",
     "start_time": "2018-11-22T19:18:03.920661Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>polarity</th>\n",
       "      <th>date</th>\n",
       "      <th>user</th>\n",
       "      <th>text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2009-04-06 22:19:45</td>\n",
       "      <td>_TheSpecialOne_</td>\n",
       "      <td>@switchfoot http://twitpic.com/2y1zl - Awww, t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>2009-04-06 22:19:49</td>\n",
       "      <td>scotthamilton</td>\n",
       "      <td>is upset that he can't update his Facebook by ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2009-04-06 22:19:53</td>\n",
       "      <td>mattycus</td>\n",
       "      <td>@Kenichan I dived many times for the ball. Man...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>2009-04-06 22:19:57</td>\n",
       "      <td>ElleCTF</td>\n",
       "      <td>my whole body feels itchy and like its on fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>2009-04-06 22:19:57</td>\n",
       "      <td>Karoli</td>\n",
       "      <td>@nationwideclass no, it's not behaving at all....</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   polarity                date             user  \\\n",
       "0         0 2009-04-06 22:19:45  _TheSpecialOne_   \n",
       "1         0 2009-04-06 22:19:49    scotthamilton   \n",
       "2         0 2009-04-06 22:19:53         mattycus   \n",
       "3         0 2009-04-06 22:19:57          ElleCTF   \n",
       "4         0 2009-04-06 22:19:57           Karoli   \n",
       "\n",
       "                                                text  \n",
       "0  @switchfoot http://twitpic.com/2y1zl - Awww, t...  \n",
       "1  is upset that he can't update his Facebook by ...  \n",
       "2  @Kenichan I dived many times for the ball. Man...  \n",
       "3    my whole body feels itchy and like its on fire   \n",
       "4  @nationwideclass no, it's not behaving at all....  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:18:12.927468Z",
     "start_time": "2018-11-22T19:18:12.911852Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    784335\n",
       "0    782333\n",
       "Name: polarity, dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.polarity = (train.polarity>0).astype(int)\n",
    "train.polarity.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:18:15.622426Z",
     "start_time": "2018-11-22T19:18:15.548936Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    180\n",
       "0    174\n",
       "Name: polarity, dtype: int64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test.polarity = (test.polarity>0).astype(int)\n",
    "test.polarity.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:18:20.141090Z",
     "start_time": "2018-11-22T19:18:19.641846Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbUAAAEfCAYAAADGLVhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X9U1HW+x/HnrNZZwhLDYdAUcnMC4dqPVRl01y1/pKG2hEE/7p67q0ao6B7l7Cja9mPruiGmKBlOpXLs3K3uBktXrNRuB06Nho6d7kZXXcXbidsPGw7cxoRgS5n7B4fvOsovFXTm6+txDufk9/Pm8/2+B5hXn+/3OzMWn8/nR0RExAR+dLkPQEREpLco1ERExDQUaiIiYhoKNRERMQ2FmoiImIZCTURETEOhJiIipqFQExER01CohZCamprLfQi9Rr0EJ/USnNRLzynURETENBRqIiJiGgo1ERExDYWaiIiYhkJNRERMQ6EmIiKmoVATERHTUKiJiIhp9L/cByAiIqFp25GmDrfPiQu/xEfyD1qpiYiIaSjURETENBRqIiJiGgo1ERExDYWaiIiYhkJNRERMQ6EmIiKmoVATERHTUKiJiIhpKNRERMQ0FGoiImIaCjURETENhZqIiJiGQk1ERExDoSYiIqahUBMREdNQqImIiGko1ERExDS6DbW8vDwiIiICvm6++WZj3O/3k5eXR3x8PNHR0cycOZPDhw8HzOHz+cjKyiImJoaYmBiysrLw+XwBNQcPHmTGjBlER0czatQo8vPz8fv9ATXbt2/H4XAQFRWFw+Fgx44dF9O7iIiYTI9Wana7nSNHjhhfH3zwgTFWWFhIUVER+fn5VFRUYLVaSUtL4+TJk0ZNZmYm1dXVlJSUUFpaSnV1NfPnzzfGv/32W9LS0oiKiqKiooLVq1ezceNGnn/+eaPG4/Ewb948MjIycLvdZGRkMGfOHD788MPeeBxERMQE+veoqH9/bDbbOdv9fj8ul4ulS5eSmpoKgMvlwm63U1payty5czly5Ajvvvsuu3btwuFwALB+/XpSUlKoqanBbrdTUlJCc3MzLpeLsLAwEhISOHr0KJs2bWLx4sVYLBZcLhcTJ07E6XQCEBcXh9vtxuVysXXr1t56PEREJIT1aKX22WefMWrUKG655RbmzZvHZ599BkBtbS1er5fJkycbtWFhYUyYMIH9+/cDbSusAQMGGIEGkJycTHh4eEDN+PHjCQsLM2qmTJnC8ePHqa2tBeDAgQMB+2mvaZ9DRESk21AbO3YsmzZtoqSkhOeeew6v18u0adP4v//7P7xeLwBWqzXge6xWK3V1dQDU1dURGRmJxWIxxi0WC4MHDw6o6WiO9jEAr9fb5X5ERES6Pf141113Bfx77Nix3Hbbbbz66quMGzcOICCwoO205NkhdrbuatpvEumupqO5z1ZTU9NtTahQL8FJvQQn9dK3vHX9Otxe86PTXX7fxfRit9u7HO/RNbUzDRgwgPj4eD799FNmzZoFtK2mhg0bZtTU19cbq6qoqCjq6+sDAsjv99PQ0BBQc/aKq76+HvjHis1ms3VYc/bqrSPdPQihov0apBmol+CkXoJTsPZia23qcLvdHt7p9/R1L+f9OrWWlhZqamqw2WzExsZis9morKwMGK+qqjKuoSUlJdHY2IjH4zFqPB4PTU1NATVVVVW0tLQYNZWVlQwZMoTY2FgAxo0bF7Cf9pozr9WJuWw70tTpl4hIR7pdqT322GPcfffdDBs2jPr6ep599lm+++47HnroISwWCwsXLmTdunXY7XZGjhzJ2rVrCQ8PJz09HWi7S3Hq1Knk5ORQWFiI3+8nJyeH6dOnG2mdnp5Ofn4+2dnZOJ1Ojh07xoYNG1i+fLmxuluwYAEzZsygoKCAWbNm8eabb+J2u9m1a1cfPjzS1/oioLqac05c5/8HKSKhr9tQ++qrr8jMzKShoYHBgwczduxY/vM//5OYmBgAlixZQnNzM8uWLcPn8zFmzBjKysq49tprjTk2b95Mbm4us2fPBiAlJYU1a9YY4wMHDuSNN97A6XQyadIkIiIiWLRoEYsXLzZqHA4HxcXFrFq1iry8PEaMGEFxcTFjx47ttQdDRERCm8Xn8/m7L5NgEKzn1S9Eey8XulLrasXVF3N2xYw/FzNQL32vs7+1rv6Wgu6amoiISLBSqImIiGko1ERExDQUaiIiYhoKNRERMY3zfkcRkc6Y9fVhZu1LxIy0UhMREdNQqImIiGko1ERExDQUaiIiYhq6UUTOi94hP9C2I0146/p1+BEcuolE5NLTSk1ERExDoSYiIqahUBMREdNQqImIiGko1ERExDQUaiIiYhoKNRERMQ2FmoiImIZefC1yGeid/0X6hlZqIiJiGgo1ERExDZ1+FAkyOjUpcuG0UhMREdNQqImIiGko1ERExDR0Te0Kpes2ImJGWqmJiIhpKNRERMQ0zjvU1q1bR0REBMuWLTO2+f1+8vLyiI+PJzo6mpkzZ3L48OGA7/P5fGRlZRETE0NMTAxZWVn4fL6AmoMHDzJjxgyio6MZNWoU+fn5+P3+gJrt27fjcDiIiorC4XCwY8eO821BRERM6rxC7cCBA7z88sskJiYGbC8sLKSoqIj8/HwqKiqwWq2kpaVx8uRJoyYzM5Pq6mpKSkooLS2lurqa+fPnG+PffvstaWlpREVFUVFRwerVq9m4cSPPP/+8UePxeJg3bx4ZGRm43W4yMjKYM2cOH3744YX2LyIiJtLjUDtx4gSPPPIIGzduJCIiwtju9/txuVwsXbqU1NRUEhIScLlcNDY2UlpaCsCRI0d499132bBhAw6Hg6SkJNavX8/u3bupqakBoKSkhObmZlwuFwkJCaSmprJkyRI2bdpkrNZcLhcTJ07E6XQSFxeH0+nk5z//OS6XqzcfExERCVE9DrX20LrjjjsCttfW1uL1epk8ebKxLSwsjAkTJrB//36gbYU1YMAAHA6HUZOcnEx4eHhAzfjx4wkLCzNqpkyZwvHjx6mtrQXaVopn7qe9pn0OERG5svXolv6XX36ZTz/9lBdffPGcMa/XC4DVag3YbrVaOX78OAB1dXVERkZisViMcYvFwuDBg6mrqzNqhg4des4c7WM33ngjXq+3w/20z9GZ9tWgGfRWL966fp3v40enL+j7utLRnDU1Nb06X7venrMn83nrvD2er6dzdqSrOXuL/l6CUzD20tnvcXe/pxfTi91u73K821Crqanh6aefZufOnVx99dWd1p0ZWNB2WvLsEDtbdzXtpx27q+lo7jN19yCEipqaml7rxdba+evU7PbOX6fW1fd15ew523vprfnO1Ntzdjeft86LLcrW4/l6MmdnOpuzt1532Ju/Y5ebeul7nf0ed/W739e9dHv60ePx0NDQwPjx44mMjCQyMpK9e/eyZcsWIiMjuf766wHOWS3V19cbq6qoqCjq6+sD7mT0+/00NDQE1HQ0B/xjxWaz2brcj4iIXNm6DbWZM2fywQcf4Ha7ja/bb7+d++67D7fbzciRI7HZbFRWVhrf09LSQlVVlXENLSkpicbGRjwej1Hj8XhoamoKqKmqqqKlpcWoqaysZMiQIcTGxgIwbty4gP2015x5rU5ERK5c3Z5+jIiICLjbEeCaa65h0KBBJCQkALBw4ULWrVuH3W5n5MiRrF27lvDwcNLT0wGIi4tj6tSp5OTkUFhYiN/vJycnh+nTpxvL0PT0dPLz88nOzsbpdHLs2DE2bNjA8uXLjdOLCxYsYMaMGRQUFDBr1izefPNN3G43u3bt6tUHRUREQlOvvPfjkiVLaG5uZtmyZfh8PsaMGUNZWRnXXnutUbN582Zyc3OZPXs2ACkpKaxZs8YYHzhwIG+88QZOp5NJkyYRERHBokWLWLx4sVHjcDgoLi5m1apV5OXlMWLECIqLixk7dmxvtCEiIiHugkLtrbfeCvi3xWJh5cqVrFy5stPvGTRoEC+99FKX8yYmJrJz584ua1JTU0lNTe35wYpc4fTm1XIl0bv0m1hXT2YiImakNzQWERHTUKiJiIhpKNRERMQ0dE1NREQ6FWrX5hVqIlews5+wvHX9jLc+0p2REop0+lFERExDoSYiIqahUBMREdNQqImIiGko1ERExDQUaiIiYhoKNRERMQ29Tk1Ezpve+V+ClUJNRER6VVf/0/OzPj4/qNOPIiJiGgo1ERExDYWaiIiYhkJNRERMQzeKiEiv6uwmAd0VKZeCVmoiImIaCjURETENnX6UkBRqn8YrIpeGVmoiImIaWqnJJXH2yspb1w9ba3CttrT6Ewl9CjURuez0XpLSW3T6UURETEOhJiIipqFQExER0+g21DZv3syECRMYPnw4w4cP56677mL37t3GuN/vJy8vj/j4eKKjo5k5cyaHDx8OmMPn85GVlUVMTAwxMTFkZWXh8/kCag4ePMiMGTOIjo5m1KhR5Ofn4/f7A2q2b9+Ow+EgKioKh8PBjh07LqZ3EQkB2440dfolcrZuQ23o0KE89dRTvPfee1RWVvKLX/yCX/3qV/z3f/83AIWFhRQVFZGfn09FRQVWq5W0tDROnjxpzJGZmUl1dTUlJSWUlpZSXV3N/PnzjfFvv/2WtLQ0oqKiqKioYPXq1WzcuJHnn3/eqPF4PMybN4+MjAzcbjcZGRnMmTOHDz/8sDcfDxERCWHd3v04c+bMgH8//vjjbN26lQMHDpCYmIjL5WLp0qWkpqYC4HK5sNvtlJaWMnfuXI4cOcK7777Lrl27cDgcAKxfv56UlBRqamqw2+2UlJTQ3NyMy+UiLCyMhIQEjh49yqZNm1i8eDEWiwWXy8XEiRNxOp0AxMXF4Xa7cblcbN26tbcfFxERCUHndU3t9OnT/OUvf6GpqYmkpCRqa2vxer1MnjzZqAkLC2PChAns378faFthDRgwwAg0gOTkZMLDwwNqxo8fT1hYmFEzZcoUjh8/Tm1tLQAHDhwI2E97TfscIiIiPXqd2sGDB5k2bRotLS2Eh4fzpz/9icTERCNQrFZrQL3VauX48eMA1NXVERkZicViMcYtFguDBw+mrq7OqBk6dOg5c7SP3XjjjXi93g730z5HV2pqanrSZkg4n168df0ubB8/Ot3rc3Y8l7fX5rrcOuqlLx7Hzubsi59Lbx//pXw8jPEr9G+/N/Xm7xYA0RfXi91u73K8R6Fmt9txu92cOHGC8vJyFi5cyJtvvmmMnxlY0HbzyNkhdrbuatpvEumupqO5Ozr+ULftSBPeOi+2KNs5Y529OPVC37HDbu/8xa699S4gnfUSijrrZW9r599ji7qwfXX2s+mLn0tv/x70xe9VV3O2X94wg8vZS++/889XfdpLj04/Xn311fzkJz/h9ttv58knn2T06NFs2rQJm63tl//s1VJ9fb2xqoqKiqK+vj7gTka/309DQ0NATUdzwD9WbDabrcv9iIiIXNDr1FpbW/n++++JjY3FZrNRWVlpjLW0tFBVVWVcQ0tKSqKxsRGPx2PUeDwempqaAmqqqqpoaWkxaiorKxkyZAixsbEAjBs3LmA/7TVnXqsTEWlX9nU/vRTgCtTt6cc//OEPTJs2jRtuuIHGxkZKS0vZs2cPr7/+OhaLhYULF7Ju3TrsdjsjR45k7dq1hIeHk56eDrTdpTh16lRycnIoLCzE7/eTk5PD9OnTjSVoeno6+fn5ZGdn43Q6OXbsGBs2bGD58uXG6cUFCxYwY8YMCgoKmDVrFm+++SZut5tdu3b14cNzZdIfvYiEqm5Dzev1kpWVRV1dHddddx2JiYmUlpYyZcoUAJYsWUJzczPLli3D5/MxZswYysrKuPbaa405Nm/eTG5uLrNnzwYgJSWFNWvWGOMDBw7kjTfewOl0MmnSJCIiIli0aBGLFy82ahwOB8XFxaxatYq8vDxGjBhBcXExY8eO7bUHQ0REQlu3oeZyuboct1gsrFy5kpUrV3ZaM2jQIF566aUu50lMTGTnzp1d1qSmphqvhxMRuVCdnY0w8ycCXCmfhKD3fhQREdNQqImIiGko1ERExDT0ydciIUR3pop0TSs1ERExDa3URER6IBTuHtRKXis1ERExEa3UREQu0oWu4kJh9RdqFGoiIkHozMDz1vUz3i1fYdc1nX4UERHTUKiJiIhpKNRERMQ0FGoiImIaCjURETENhZqIiJiGQk1ERExDoSYiIqahF1+LSIf0PoISirRSExER01CoiYiIaSjURETENHRNzQR07UNEpI1WaiIiYhoKNRERMQ2FmoiImIauqQURXRsTEbk4WqmJiIhpaKUmIpeEzkTIpdDtSq2goIBJkyYxfPhwbrrpJh544AEOHToUUOP3+8nLyyM+Pp7o6GhmzpzJ4cOHA2p8Ph9ZWVnExMQQExNDVlYWPp8voObgwYPMmDGD6OhoRo0aRX5+Pn6/P6Bm+/btOBwOoqKicDgc7Nix40J7FxERk+k21Pbs2cPDDz/M7t27KS8vp3///tx777188803Rk1hYSFFRUXk5+dTUVGB1WolLS2NkydPGjWZmZlUV1dTUlJCaWkp1dXVzJ8/3xj/9ttvSUtLIyoqioqKClavXs3GjRt5/vnnjRqPx8O8efPIyMjA7XaTkZHBnDlz+PDDD3vr8RARueJsO9LU6Veo6fb0Y1lZWcC/X3zxRWJiYti3bx8pKSn4/X5cLhdLly4lNTUVAJfLhd1up7S0lLlz53LkyBHeffdddu3ahcPhAGD9+vWkpKRQU1OD3W6npKSE5uZmXC4XYWFhJCQkcPToUTZt2sTixYuxWCy4XC4mTpyI0+kEIC4uDrfbjcvlYuvWrb392IiISIg57xtFGhsbaW1tJSIiAoDa2lq8Xi+TJ082asLCwpgwYQL79+8H2lZYAwYMMAINIDk5mfDw8ICa8ePHExYWZtRMmTKF48ePU1tbC8CBAwcC9tNe0z6HiIhc2c471FasWMHo0aNJSkoCwOv1AmC1WgPqrFYrdXV1ANTV1REZGYnFYjHGLRYLgwcPDqjpaI72sfZ9dbUfERG5sp3X3Y+PPvoo+/btY9euXfTr1y9g7MzAgrabR84OsbN1V9N+k0h3NR3Nfaaampoux4OFt65fD2q8l+BILg31EpxCqZeaH53uYrTfeffS1Xw9+fvsyznbe+mLY7ykoi/uOdlut3c53uNQW7lyJWVlZezYsYMbb7zR2G6z2YC21dSwYcOM7fX19caqKioqivr6+oAA8vv9NDQ0BNScveKqr68H/rFis9lsHdacvXo7W3cPQrCwtXZ9UdZb58UWZbtER9O31EtwCrVe9rZ2NXr+vdjt4Z2Odff32Zdznvlz6YtjvLS+6tPn5B6dfszNzaW0tJTy8nJuvvnmgLHY2FhsNhuVlZXGtpaWFqqqqoxraElJSTQ2NuLxeIwaj8dDU1NTQE1VVRUtLS1GTWVlJUOGDCE2NhaAcePGBeynvebMa3UiInLl6jbUnE4nr776Klu2bCEiIgKv14vX66WxsRFoOx24cOFCNmzYQHl5OYcOHSI7O5vw8HDS09OBtrsUp06dSk5ODgcOHMDj8ZCTk8P06dONxE5PTycsLIzs7GwOHTpEeXk5GzZsIDs721jdLViwgPfff5+CggKOHj1KQUEBbrebhQsX9tXjIyIiIaTb049btmwBMG7Xb5ebm8vKlSsBWLJkCc3NzSxbtgyfz8eYMWMoKyvj2muvNeo3b95Mbm4us2fPBiAlJYU1a9YY4wMHDuSNN97A6XQyadIkIiIiWLRoEYsXLzZqHA4HxcXFrFq1iry8PEaMGEFxcTFjx469iIdARETMottQO/tdPzpisVhYuXKlEXIdGTRoEC+99FKX8yQmJrJz584ua1JTU88JWBEREdB7P4qIGELxHTQkkN6lX0RETEOhJiIipqHTjyIifUinNC8thZqISAhRSHZNpx9FRMQ0FGoiImIaCjURETENhZqIiJiGQk1ERExDoSYiIqahUBMREdNQqImIiGko1ERExDQUaiIiYhoKNRERMQ2FmoiImIZCTURETEOhJiIipqFQExER01CoiYiIaSjURETENBRqIiJiGgo1ERExDYWaiIiYhkJNRERMQ6EmIiKmoVATERHTUKiJiIhp9CjU9u7dy4MPPsioUaOIiIjglVdeCRj3+/3k5eURHx9PdHQ0M2fO5PDhwwE1Pp+PrKwsYmJiiImJISsrC5/PF1Bz8OBBZsyYQXR0NKNGjSI/Px+/3x9Qs337dhwOB1FRUTgcDnbs2HEhfYuIiAn1KNSamppISEhg9erVhIWFnTNeWFhIUVER+fn5VFRUYLVaSUtL4+TJk0ZNZmYm1dXVlJSUUFpaSnV1NfPnzzfGv/32W9LS0oiKiqKiooLVq1ezceNGnn/+eaPG4/Ewb948MjIycLvdZGRkMGfOHD788MOLeQxERMQk+vekaNq0aUybNg2A7OzsgDG/34/L5WLp0qWkpqYC4HK5sNvtlJaWMnfuXI4cOcK7777Lrl27cDgcAKxfv56UlBRqamqw2+2UlJTQ3NyMy+UiLCyMhIQEjh49yqZNm1i8eDEWiwWXy8XEiRNxOp0AxMXF4Xa7cblcbN26tdceFBERCU0XfU2ttrYWr9fL5MmTjW1hYWFMmDCB/fv3A20rrAEDBhiBBpCcnEx4eHhAzfjx4wNWglOmTOH48ePU1tYCcODAgYD9tNe0zxEKth1p6vRLREQuzkWHmtfrBcBqtQZst1qt1NXVAVBXV0dkZCQWi8UYt1gsDB48OKCmoznax9r31dV+RETkytaj0489cWZgQdtpybND7Gzd1bTfJNJdTUdzn6mmpqabo+9dZV/367O5vXXePpv7UlMvwUm9BCfT9BJ9cc/Jdru9y/GLDjWbzQa0raaGDRtmbK+vrzdWVVFRUdTX1wcEkN/vp6GhIaDm7BVXfX098I8Vm81m67Dm7NXb2bp7EHqbrbVvTiV667zYomx9Mvelpl6Ck3oJTmbqBb7q0+fkiz79GBsbi81mo7Ky0tjW0tJCVVWVcQ0tKSmJxsZGPB6PUePxeGhqagqoqaqqoqWlxaiprKxkyJAhxMbGAjBu3LiA/bTXnHmtTkRErlw9CrXGxkaqq6uprq6mtbWVL774gurqaj7//HMsFgsLFy5kw4YNlJeXc+jQIbKzswkPDyc9PR1ou0tx6tSp5OTkcODAATweDzk5OUyfPt1I7PT0dMLCwsjOzubQoUOUl5ezYcMGsrOzjdXdggULeP/99ykoKODo0aMUFBTgdrtZuHBhHz08IiISSiw+n8/fXZHb7eaee+45Z/tDDz2Ey+XC7/ezevVqtm3bhs/nY8yYMaxdu5aEhASj9ptvviE3N5edO3cCkJKSwpo1a4iIiDBqDh48iNPp5KOPPiIiIoK5c+eSm5sbcM1s+/btrFq1is8++4wRI0bw2GOP8ctf/vKiHoTe1ld3MprpFIR6CU7qJTiZqZef/ahvTz/2KNTk/CjUuqdegpN6CU5m6qWvQ03v/SgiIqahUBMREdNQqImIiGko1ERExDQUaiIiYhoKNRERMQ2FmoiImIZCTURETEOhJiIipqFQExER01CoiYiIaSjURETENBRqIiJiGgo1ERExDYWaiIiYhkJNRERMo//lPoBQ1VcfBCoiIhdOKzURETENhZqIiJiGQk1ERExDoSYiIqahUBMREdNQqImIiGko1ERExDQUaiIiYhoKNRERMQ2FmoiImIZCTURETEOhJiIiphGSobZlyxZuueUWbDYbd9xxBx988MHlPiQREQkCIfcu/WVlZaxYsYJ169aRnJzMli1byMjIYN++fQwfPrzX96d34xcRCR0ht1IrKirin//5n/nNb35DXFwczz77LDabjeLi4st9aCIicplZfD6f/3IfRE99//33DBkyhK1bt3Lvvfca251OJ4cOHeLtt9++jEcnIiKXW0it1BoaGjh9+jRWqzVgu9Vqpa6u7jIdlYiIBIuQCrV2Fosl4N9+v/+cbSIicuUJqVCLjIykX79+56zK6uvrz1m9iYjIlSekQu3qq6/mtttuo7KyMmB7ZWUlDofjMh2ViIgEi5C7pX/RokXMnz+fMWPG4HA4KC4u5uuvv2bu3LmX+9BEROQyC6mVGsDs2bPJy8vj2WefZeLEiezbt4/XX3+dmJiYc2pD8UXaBQUFTJo0ieHDh3PTTTfxwAMPcOjQoYAav99PXl4e8fHxREdHM3PmTA4fPnyZjrhn1q1bR0REBMuWLTO2hVofX3/9NQsWLOCmm27CZrPhcDjYs2ePMR4q/Zw+fZpVq1YZfxu33HILq1at4tSpU0ZNsPayd+9eHnzwQUaNGkVERASvvPJKwHhPjtvn85GVlUVMTAwxMTFkZWXh8/kuZRtA17388MMPPPnkk0yYMIGhQ4cSFxdHZmYmn3/+ecAcf//731m2bBk/+clPGDp0KA8++CBffvnlpW6l25/LmZYsWUJERAQbN24M2N5bvYRcqAFkZmbyySefUFdXx3vvvcfPfvazc2raX6T9u9/9jvfff5+kpCQyMjLO+aUINnv27OHhhx9m9+7dlJeX079/f+69916++eYbo6awsJCioiLy8/OpqKjAarWSlpbGyZMnL+ORd+7AgQO8/PLLJCYmBmwPpT58Ph/Tp0/H7/fz+uuvs3//ftasWRNwLTdU+tmwYQNbtmwhPz8fj8fD6tWr2bx5MwUFBUZNsPbS1NREQkICq1evJiws7Jzxnhx3ZmYm1dXVlJSUUFpaSnV1NfPnz7+UbQBd9/Ldd9/x8ccf43Q6ee+993j11Vf58ssvSU9PD/ifj5UrV7Jjxw62bt3K22+/zcmTJ3nggQc4ffp00PRypu3bt/PRRx8xZMiQc8Z6q5eQep3a+ZgyZQqJiYk899xzxraf/vSnpKam8uSTT17GIzs/jY2NxMTE8Morr5CSkoLf7yc+Pp5HHnkEp9MJQHNzM3a7nX/9138NutOwJ06c4I477qCwsJA1a9aQkJDAs88+G3J9PP300+zdu5fdu3d3OB5K/TzwwAMMGjSIF154wdi2YMECvvnmG/785z+HTC833HADa9as4Ve/+hXQs5/BkSNHcDgc7Nq1i+TkZABziaITAAAJh0lEQVSqqqpISUnhwIED2O32oOilI3/7299ITk5m7969JCYmcuLECUaOHElRURH3338/AF988QWjR4+mtLSUKVOmXKrDD9BZL//7v//L9OnT+Y//+A/S09PJysrit7/9LUCv9hKSK7XufP/99/z1r39l8uTJAdsnT57M/v37L9NRXZjGxkZaW1uJiIgAoLa2Fq/XG9BbWFgYEyZMCMreli5dSmpqKnfccUfA9lDr46233mLMmDHMnTuXkSNH8vOf/5yXXnoJv7/t/wlDqZ/k5GT27NnD0aNHgbYnS7fbzV133QWEVi9n6slxezweBgwYEHBjWXJyMuHh4UHdG2CsNtufC/7617/yww8/BPQ7bNgw4uLigq6XU6dOkZmZidPpJC4u7pzx3uwl5G4U6QkzvUh7xYoVjB49mqSkJAC8Xi9Ah70dP378kh9fV15++WU+/fRTXnzxxXPGQqkPgM8++4ytW7eSnZ3N0qVL+eSTT8jNzQUgKysrpPpZunQpjY2NOBwO+vXrx6lTp3A6nWRmZgKh97Np15PjrqurIzIyMuB1rRaLhcGDBwf1c8P333/PY489xt13380NN9wAtPXSr18/IiMjA2qD8XkuLy+PQYMG8fDDD3c43pu9mDLU2oX6i7QfffRR9u3bx65du+jXr1/AWLD3VlNTw9NPP83OnTu5+uqrO60L9j7atba2cvvttxunrm+99VY+/fRTtmzZQlZWllEXCv2UlZXx7//+72zZsoX4+Hg++eQTVqxYQUxMDL/+9a+NulDopSPdHXdHPQRzb6dOnSIrK4sTJ07w2muvdVsfbL3s2bOHV199Fbfbfd7feyG9mPL0oxlepL1y5Ur+8pe/UF5ezo033mhst9lsAEHfm8fjoaGhgfHjxxMZGUlkZCR79+5ly5YtREZGcv311wPB30c7m812zmmTm2++mS+++MIYh9Do54knnmDx4sXcd999JCYm8uCDD7Jo0SLWr18PhFYvZ+rJcUdFRVFfX2+cNoa2J86Ghoag7O3UqVM8/PDDHDx4kO3btxt/N9DWy+nTp2loaAj4nmD7Obndbr7++mvi4uKM54LPP/+cJ598koSEBKB3ezFlqIX6i7Rzc3MpLS2lvLycm2++OWAsNjYWm80W0FtLSwtVVVVB1dvMmTP54IMPcLvdxtftt9/Offfdh9vtZuTIkSHRR7vk5GSOHTsWsO3YsWPGxx2Fys8F2u6sO3vl369fP1pbW4HQ6uVMPTnupKQkGhsb8Xg8Ro3H46GpqSnoevvhhx+YO3cuBw8eZMeOHUZot7vtttu46qqrAvr98ssvjZthgkVmZiZ79+4NeC4YMmQI2dnZbN++HejdXkx7+jFUX6TtdDr585//zJ/+9CciIiKM6wTh4eEMGDAAi8XCwoULWbduHXa7nZEjR7J27VrCw8NJT0+/zEf/DxEREcYF7XbXXHMNgwYNMv7vLBT6aJednc20adNYu3Yts2fPprq6mpdeeonHH38cIGR+LgB33303GzZsIDY2lvj4eKqrqykqKuLBBx8EgruXxsZGPv30U6DtlPAXX3xBdXU1gwYNYvjw4d0ed1xcHFOnTiUnJ4fCwkL8fj85OTlMnz79kt/52FUvQ4YM4Te/+Q3/9V//xWuvvYbFYjGeC6677jrCwsIYOHAg//Iv/8ITTzyB1Wpl0KBB/P73vycxMZE777wzaHoZPnz4Oaut/v37Y7PZjMe8N3sx7S390Pbi68LCQrxeL6NGjeKZZ57p8DVtweTsIGiXm5vLypUrgbbTJatXr2bbtm34fD7GjBnD2rVrjbAIVjNnzjRu6YfQ62P37t08/fTTHDt2jGHDhvHII48wf/5845x/qPRz8uRJ/vjHP/Lmm29SX1+PzWbjvvvuY/ny5fz4xz8GgrcXt9vNPffcc872hx56CJfL1aPj/uabb8jNzWXnzp0ApKSksGbNmk7/9vpKV72sWLGCW2+9tcPvKyoqMm6Xb2lp4fHHH6e0tJSWlhZ+8YtfsG7dOoYNG9anx3627n4uZxs9enTALf3Qe72YOtREROTKYspraiIicmVSqImIiGko1ERExDQUaiIiYhoKNRERMQ2FmoiImIZCTURETEOhJhIkqqqqyMvL6/NPYb5U+xG5HBRqIkFi37595Ofnc+LECVPsR+RyUKiJiIhpKNREgkBeXh5PPfUU0PZZbe1vCN3+GVSVlZXMmjWLYcOGMXToUGbNmhXwicDNzc0kJSXx05/+lKamJmN7U1MTt99+O0lJSbS0tHS7H5FQZ9p36RcJJffccw81NTWUlZXxzDPPGJ8AHBcXR2lpKVlZWUycOJHf//73tLa28sorr/DLX/6St956i7FjxxIWFsYLL7zAtGnTeOKJJ1i3bh0Ajz/+OJ9//jnvvPMOP/7xj7vcj4gZ6A2NRYLE+vXreeqpp/j444+JjY0F2lZaiYmJpKSkBLzb+XfffUdycjI33ngj5eXlxvY//vGPPPvss5SVlQEwe/Zsli9fzqOPPtrlfkTMQis1kSBWWVmJz+fj/vvvP+dTge+8805ee+01fvjhB6666ioAli9fzjvvvMNvf/tb/H4/t956K8uWLbschy5yWSjURILY//zP/wCQlpbWac2JEycYPHgwAFdddRWbNm3iZz/7Gf3796esrMwIPJErgUJNJIi1trYCsGnTJoYOHdphzXXXXRfw74qKCgBOnTrFkSNHiI+P79uDFAkiCjWRINH+CdpnGjFiBACDBw/u0cfa/+1vf2PVqlXcd999fPnll/zud79jwoQJWK3WLvcjYha6pV8kSFxzzTUAAe/0MWXKFAYOHMjatWv5+9//fs731NfXG/996tQpFixYwPXXX8/atWtxuVw0NzezdOnSbvcjYhb9VqxY8YfLfRAi0naq8d/+7d/44osvOH36NEePHuWGG24gMTGRF154gTfeeAOfz8exY8d4++23eeaZZ3jnnXe4//77AVizZg2lpaUUFxfzT//0TwwaNIiBAwdSVFREbGwso0eP7nQ/VquV8PDwy9m+SK/QLf0iQWTt2rVs27aNr776itbWVnbs2MHEiRPZv38/BQUF7N+/n+bmZmw2G2PHjuXXv/41d955Jx9//DFTp07loYce4rnnnjPm8/v9zJ49m48++ogPPviAG264ocv9iIQ6hZqIiJiGrqmJiIhpKNRERMQ0FGoiImIaCjURETENhZqIiJiGQk1ERExDoSYiIqahUBMREdNQqImIiGko1ERExDT+H72XRNiM0mrqAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(train.text.str.len(), kde=False);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:18:20.259126Z",
     "start_time": "2018-11-22T19:18:20.143288Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count                 1566668\n",
       "unique                 765666\n",
       "top       2009-06-15 12:53:14\n",
       "freq                       20\n",
       "first     2009-04-06 22:19:45\n",
       "last      2009-06-25 10:28:31\n",
       "Name: date, dtype: object"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.date.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:18:20.488156Z",
     "start_time": "2018-11-22T19:18:20.260138Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "650606"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.user.nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:16:29.418393Z",
     "start_time": "2018-11-22T19:16:28.813193Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "lost_dog           549\n",
       "webwoke            341\n",
       "SallytheShizzle    276\n",
       "VioletsCRUK        275\n",
       "mcraddictal        274\n",
       "tsarnick           247\n",
       "what_bugs_u        246\n",
       "Karen230683        237\n",
       "DarkPiano          232\n",
       "SongoftheOss       226\n",
       "Name: user, dtype: int64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.user.value_counts().head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create text vectorizer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We create a document-term matrix with 934 tokens as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:19:01.584161Z",
     "start_time": "2018-11-22T19:18:47.830361Z"
    }
   },
   "outputs": [],
   "source": [
    "vectorizer = CountVectorizer(min_df=.001, max_df=.8, stop_words='english')\n",
    "train_dtm = vectorizer.fit_transform(train.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:19:01.587749Z",
     "start_time": "2018-11-22T19:19:01.585491Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<1566668x934 sparse matrix of type '<class 'numpy.int64'>'\n",
       "\twith 6332930 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_dtm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:19:13.384051Z",
     "start_time": "2018-11-22T19:19:13.378622Z"
    }
   },
   "outputs": [],
   "source": [
    "test_dtm = vectorizer.transform(test.text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train Naive Bayes Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:27:27.856821Z",
     "start_time": "2018-11-22T19:27:27.695934Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nb = MultinomialNB()\n",
    "nb.fit(train_dtm, train.polarity)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predict Test Polarity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "predicted_polarity = nb.predict(test_dtm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluate Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:27:47.481529Z",
     "start_time": "2018-11-22T19:27:47.468974Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7768361581920904"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(test.polarity, predicted_polarity)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### TextBlob for Sentiment Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:57:48.007733Z",
     "start_time": "2018-11-22T19:57:48.001084Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ok its cake and ice cream time! Ha! See what I'm talking about! The temptation is there! \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sample_positive = train.text.loc[256332]\n",
    "print(sample_positive)\n",
    "parsed_positive = TextBlob(sample_positive)\n",
    "parsed_positive.polarity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:57:48.496070Z",
     "start_time": "2018-11-22T19:57:48.488459Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " i hate this place\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "-0.8"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sample_negative = train.text.loc[636079]\n",
    "print(sample_negative)\n",
    "parsed_negative = TextBlob(sample_negative)\n",
    "parsed_negative.polarity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:01:50.649282Z",
     "start_time": "2018-11-22T19:01:50.644939Z"
    }
   },
   "outputs": [],
   "source": [
    "def estimate_polarity(text):\n",
    "    return TextBlob(text).sentiment.polarity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:57:50.952685Z",
     "start_time": "2018-11-22T19:57:50.872680Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>286878</th>\n",
       "      <td>Waiting to board the plane. Frustrated that Sa...</td>\n",
       "      <td>-0.141667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>608505</th>\n",
       "      <td>I FEEL SO LOST RIGHT NOW.  wtf..</td>\n",
       "      <td>-0.107143</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1049211</th>\n",
       "      <td>Chocolate cookies with cocoa nibs and lime rec...</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1054879</th>\n",
       "      <td>@GrahamNelson You're a cubs fan?! Oh boy. http...</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261809</th>\n",
       "      <td>work tomorrow. goodbye weekend</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>776057</th>\n",
       "      <td>damn mood off..leavimg m dear home..hyderabad....</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1296985</th>\n",
       "      <td>is packing her bag and wants to dive into the ...</td>\n",
       "      <td>0.066667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1180514</th>\n",
       "      <td>yay new moon is a trending topic on twitter</td>\n",
       "      <td>0.136364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>350779</th>\n",
       "      <td>Forget same page... I think I'm reading a whol...</td>\n",
       "      <td>0.175000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>425694</th>\n",
       "      <td>@tommcfly you would get on really well with my...</td>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                      text  sentiment\n",
       "286878   Waiting to board the plane. Frustrated that Sa...  -0.141667\n",
       "608505                    I FEEL SO LOST RIGHT NOW.  wtf..  -0.107143\n",
       "1049211  Chocolate cookies with cocoa nibs and lime rec...   0.000000\n",
       "1054879  @GrahamNelson You're a cubs fan?! Oh boy. http...   0.000000\n",
       "261809                     work tomorrow. goodbye weekend    0.000000\n",
       "776057   damn mood off..leavimg m dear home..hyderabad....   0.000000\n",
       "1296985  is packing her bag and wants to dive into the ...   0.066667\n",
       "1180514       yay new moon is a trending topic on twitter    0.136364\n",
       "350779   Forget same page... I think I'm reading a whol...   0.175000\n",
       "425694   @tommcfly you would get on really well with my...   0.200000"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train[['text']].sample(10).assign(sentiment=lambda x: x.text.apply(estimate_polarity)).sort_values('sentiment')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Compare with TextBlob Polarity Score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also obtain TextBlob sentiment scores for the tweets and note (see left panel in below figure) that positive test tweets receive a significantly higher sentiment estimate. We then use the MultinomialNB ‘s model .predict_proba() method to compute predicted probabilities and compare both models using the respective Area Under the Curve (see right panel below)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:19:35.423684Z",
     "start_time": "2018-11-22T19:19:35.301114Z"
    }
   },
   "outputs": [],
   "source": [
    "test['sentiment'] = test.text.apply(estimate_polarity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:39:00.506536Z",
     "start_time": "2018-11-22T19:39:00.492227Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7429378531073446"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(test.polarity, (test.sentiment>0).astype(int))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ROC AUC Scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:24:36.678618Z",
     "start_time": "2018-11-22T19:24:36.673660Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8254948914431672"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_true=test.polarity, y_score=test.sentiment)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:24:59.154671Z",
     "start_time": "2018-11-22T19:24:59.150504Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.848595146871009"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_true=test.polarity, y_score=nb.predict_proba(test_dtm)[:, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:35:57.575353Z",
     "start_time": "2018-11-22T19:35:57.568683Z"
    }
   },
   "outputs": [],
   "source": [
    "fpr_tb, tpr_tb, _ = roc_curve(y_true=test.polarity, y_score=test.sentiment)\n",
    "roc_tb = pd.Series(tpr_tb, index=fpr_tb)\n",
    "fpr_nb, tpr_nb, _ = roc_curve(y_true=test.polarity, y_score=nb.predict_proba(test_dtm)[:, 1])\n",
    "roc_nb = pd.Series(tpr_nb, index=fpr_nb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Naive Bayes model outperforms TextBlob in this case."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-22T19:38:33.287623Z",
     "start_time": "2018-11-22T19:38:32.991173Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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sAFPT09cXFxwdHSkUaNGLFmyBJVKZTC2Hj16UL16dUqUKEGlSpVwd3dnypQpaDSaHJ0zIV4n0gIuXlsRERF06NCByMhImjZtSsuWLXny5AnBwcH07t2b2bNnM3r0aACUSiXr16+nefPmDBs2jNDQUG2X3ICAAAICAmjUqJH2qXf//v3ZvHkzJ06coHPnzlStWlW7XwsLi2xjS0xMJDw8HEjvop4djUZD3759CQoKwtnZmU8++QSFQsGuXbuYOHEihw4dYvPmzRgZGelt17t3b65du0b79u0B2LlzJzNmzODChQusXr06230XK1YMSE+mY2Njsbe3z3YbeLHzn9m1a9do0aIF1apVo3fv3sTExPDrr7/SvXt3du/eTYMGDYDcuQYdOnRArVbTqVMnHjx4wNatW+nVqxc7duxgwYIF3Lx5k1atWqFSqQgMDGT06NE4Ojri6empU9fcuXNZtGgRDg4OeHp6Urx4cc6dO8eqVasIDg5m//79ODg46MXg4+PD4cOHadWqFS1atODQoUOsXbuWW7dusWXLFgAqVarE559/zpIlSyhevDiDBg3Sbl+vXr0sj/Flr921a9fo1KkTd+7coVatWgwYMACNRsP169dZt24d3bp1o2jRogBcuXKFdu3acf/+fdzd3fHy8uLOnTts376dvXv3smrVKrp166a3j4sXL+Lp6UmtWrXo3bs3sbGxmJmZAeldIz/66CMePXpEq1at6NChA/fv3ycoKIj27duzevVqnS+F/fv3Z+/evdSoUYNevXqhVCr5999/+eOPPwgODta7XkIIkVdMTHS/Gm/cuJGUlBQ6deqU5Stynp6e1K5dmzNnzrB9+3b69OkDwPr164H0B82lSpXKct/m5ubZxnfz5k1CQkJQKpWMHTs22/VzUmdOfPHFFxw/fhxPT09at25NkSJF6NmzJ19++SUBAQGMGjVKb5tff/2VpKQkevbsqf1+k5qayscff0xwcDCVKlXio48+wtzcnKNHjzJ79mx+//13AgMDtddh79699OjRA2tra9q0aUPp0qWJi4vjn3/+YdWqVcyaNUvvmgnxupNPrHhtDR48mDt37rB582ad95cePnzIhx9+yKxZs2jXrh0VK1YEoHLlyixevJihQ4cyaNAgduzYwT///IOPjw/FihVj7dq1GBsbA+lf+K9du8aJEyfo0qVLll3IT506pX0irFariY2NZe/evcTGxjJjxgzq1KmT7bFs2LCBoKAg6tWrx44dO7C0tARg+vTpdOrUieDgYNavX6+TnEF6y2B0dDTh4eEUKVIEgClTpuDp6cmWLVvo0qULbdq0yXLfNjY2tGzZkv379+Pp6Um/fv1o0KABNWrUyLLr8oue/wwhISHMmzePESNGaMvatWtHv379WLFihU4CntNrYEhERATdu3fHz89Pe13ff/99vL296dGjB3Xr1iUsLEybzHfu3JmuXbuydOlSnYRu3759LFq0iKZNm7J582asra21y9atW8e4ceOYOnWqtnUjswsXLhAeHk6JEiUAUKlUtG7dmr179/L333/j6uqqk4A7ODgYfCXjeV7m2mk0Gvr378+dO3eYPn06n3/+uc7yuLg47fkCGD16NPfv32fOnDk6X6CGDRuGp6cn3t7euLu7670KcPToUaZNm8a4ceN0ypOTk+nbty/Jycns27dP5yFDZGQkzZs3Z8yYMbRo0QI7Ozvu3r3L3r17adSoEUFBQXoPoXLSI0UIIV7FtWvXCAsLA9AbLDPjYbuHh0e29Xh4eHDmzBnCw8O1CXhGr5/mzZvnSqwZ9dWuXfu5rdl54fz58xw+fFivx1Xz5s3Zv38/Z86coXbt2jrLMt6n7927t7bsq6++Ijg4mCFDhjB//nzt/UitVjN27Fi+//571q5dy7Bhw4D0708ajYYdO3ZQq1YtnfofPHggybcolKQLungtnThxgj/++AMvLy+9wUOKFi2Kj48PaWlp/PzzzzrLevToQZ8+fQgLC2PmzJn079+fhIQE/Pz8XnpKr9OnT7NgwQIWLFjAokWL8Pf35/bt27Ro0SLHLXMbN24EYPbs2drkG9JbejO6xX///fcGt500aZI2+QawtrZm4sSJOvVmx8/PD09PT65du8a0adPw9PTE2dmZxo0bM2fOHO7du6ez/suef4B33nmH4cOH65R16tSJYsWKcfr06RzFmxMKhYJ58+bpJJNeXl4APH78mJkzZ+q0pHt4eODg4MD58+d16vHz8wNg2bJlOsk3wKBBg6hYsSLbt283ODrt5MmTtck3gJmZmfaLRm4d64teu6NHj/LXX39Rp04dg60jdnZ22uO8evUq4eHhVKhQQeeBCaT37OjTpw/x8fH88ssvevU4Ozvj7e2tV75jxw5u377NZ599ptfC7+zs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nXeMjgQf4err8Y4dOzR48GBZLBZdd911SkhI8FJS3+LKuK5fv16jR49W+/btFRoaqiFDhmjTpk1eTOsbqvrZYffu3QoODtb111/v4YS+ydVxLSws1HPPPaeePXuqRYsW6t69u5YsWeKltL7D1XF9//33dcMNN+iqq65Sx44d9dBDDykjI8NLaau/qnzO+f777zVs2DC1bNlSXbp00cKFC2W3V25yMQpw1Chr1qxRbGysnnzySW3btk2RkZEaO3asjh07ZnQ0wGdduHBBXbt21fPPP6+6desaHQc+wtXX47S0NI0bN06RkZHatm2b/vjHP2rWrFlat26dl5NXb66O686dOzVo0CAlJiZq27ZtGjp0qO655x6+nP6dqn52yMnJ0dSpUzV48GAvJfUtVRnXBx54QJ999pleeeUV7d+/X3//+9/VrVs3L6au/lwd1z179igmJkYTJkzQ7t279c477+jQoUN68MEHvZy8+nL1c865c+c0evRotWjRQps3b9bzzz+vV199Va+99lqlno95wFGjDBkyRN26ddPf/vY3R1vv3r01cuRIzZ0718BkQM1wzTXX6IUXXtDdd99tdBRUc66+Hs+dO1dJSUn68ssvHW2PPvqoDh06pE8++cQrmX2BO97noqOjdf311+u5557zVEyfUtUxveeee9S9e3fZ7XatX79eu3fv9kZcn+HquG7evFn33XefvvrqKwUHB3szqk9xdVxfffVVLV26VN99952j7e2339bs2bN14sQJr2T2JZX5nLNixQr97//+r3788UdHwR4fH6+EhAQdPHhQJpOp3OfgCDhqjMLCQh04cEDR0dFO7dHR0dq7d69BqQCg9qnK6/G+fftK9B8yZIi++uorFRUVeSyrL3HX+1xubq6aNGni7ng+qapjunz5cmVmZmrmzJmejuiTqjKuGzduVK9evbR48WJ17dpVvXv31qxZs5Sbm+uNyD6hKuMaFRWljIwM/etf/5Ldbld2drbWrFmjoUOHeiNyjbRv3z5df/31TkfLhwwZolOnTumXX36pcH0KcNQY2dnZslqtCgkJcWoPCQlRZmamQakAoPapyutxZmZmqf2Li4uVnZ3tsay+xB3vc2+++aZOnjyp8ePHeyKiz6nKmH7//fdauHChli1bJrPZ7I2YPqcq45qWlqY9e/bou+++08qVKxUfH6/PPvtMDz/8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\n",
      "text/plain": [
       "<Figure size 1008x432 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(ncols=2, figsize=(14, 6))\n",
    "sns.boxplot(x='polarity', y='sentiment', data=test, ax=axes[0])\n",
    "axes[0].set_title('TextBlob Sentiment Scores')\n",
    "roc_nb.plot(ax=axes[1], label='Naive Bayes', legend=True, lw=1, title='ROC Curves')\n",
    "roc_tb.plot(ax=axes[1], label='TextBlob', legend=True, lw=1)\n",
    "fig.tight_layout();"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "316px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
